-
Notifications
You must be signed in to change notification settings - Fork 44
Add Fold Weights for Variable Resample Weighting #1007
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Hey @tjburch. Thanks for the PR. We're doing a pretty invasive update the this package that will take some time. We'll look at the PR after things are settled there but it might be another 2-3 weeks. Is this something time-sensitive for you? |
Nope. Just had some bandwidth staying awake on paternity leave. Review at your leisure, let me know if I can assist otherwise. |
I estimate that 5% of all my work has been while waiting at the bustop or for some sort of practice to end 😄 |
Got around to deploying this into a local project and running into some odd errors. Will circle back. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit
air
[air] reported by reviewdog 🐶
Line 393 in 27a5ab5
[air] reported by reviewdog 🐶
Line 399 in 27a5ab5
#' |
[air] reported by reviewdog 🐶
Line 408 in 27a5ab5
[air] reported by reviewdog 🐶
Line 411 in 27a5ab5
[air] reported by reviewdog 🐶
Line 414 in 27a5ab5
[air] reported by reviewdog 🐶
Line 419 in 27a5ab5
#' |
[air] reported by reviewdog 🐶
Line 427 in 27a5ab5
[air] reported by reviewdog 🐶
Line 430 in 27a5ab5
[air] reported by reviewdog 🐶
Line 436 in 27a5ab5
#' |
[air] reported by reviewdog 🐶
Line 440 in 27a5ab5
#' |
[air] reported by reviewdog 🐶
Line 466 in 27a5ab5
[air] reported by reviewdog 🐶
Line 481 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 547 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 550 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 555 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 561 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 566 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 578 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 583 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 590 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 594 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Lines 596 to 600 in 27a5ab5
unweighted_results <- fit_resamples(simple_wflow, folds, | |
control = control_resamples(save_pred = FALSE)) | |
weighted_results_equal <- fit_resamples(simple_wflow, weighted_folds_equal, | |
control = control_resamples(save_pred = FALSE)) | |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 604 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Lines 606 to 607 in 27a5ab5
expect_equal(unweighted_metrics$mean, weighted_metrics_equal$mean, tolerance = 1e-10) | |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 609 in 27a5ab5
unequal_weights <- c(0.1, 0.3, 0.6) # Higher weight on last fold |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Lines 611 to 613 in 27a5ab5
weighted_results_unequal <- fit_resamples(simple_wflow, weighted_folds_unequal, | |
control = control_resamples(save_pred = FALSE)) |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 615 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Lines 617 to 618 in 27a5ab5
expect_false(all(abs(unweighted_metrics$mean - weighted_metrics_unequal$mean) < 1e-10)) | |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 621 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 626 in 27a5ab5
expect_equal(sum(calculated_weights), 1) # Should sum to 1 now |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 631 in 27a5ab5
skip_if_not_installed("parsnip") |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 635 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 640 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 644 in 27a5ab5
tune_mod <- parsnip::linear_reg(penalty = tune()) %>% |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 649 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 652 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 656 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Lines 658 to 661 in 27a5ab5
weighted_tune_results <- tune_grid(tune_wflow, weighted_folds, | |
grid = simple_grid, | |
control = control_grid(save_pred = FALSE)) | |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Lines 663 to 664 in 27a5ab5
expect_s3_class(weighted_tune_results, "tune_results") | |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 669 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Lines 671 to 673 in 27a5ab5
unweighted_tune_results <- tune_grid(tune_wflow, folds, | |
grid = simple_grid, | |
control = control_grid(save_pred = FALSE)) |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 675 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 677 in 27a5ab5
expect_false(all(abs(weighted_metrics$mean - unweighted_metrics$mean) < 1e-10)) |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Lines 2 to 3 in 27a5ab5
if (rlang::is_installed(c("rsample", "parsnip", "yardstick", "workflows", "recipes", "kknn"))) { | |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 15 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 26 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 31 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 36 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 41 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 51 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 54 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 62 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 72 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 74 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 85 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 95 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 97 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 108 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 119 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 122 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 131 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 135 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 139 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 143 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 148 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 150 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 161 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 171 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 182 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 186 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 191 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 195 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 204 in 27a5ab5
c(1/6, 1/3, 1/2) # normalized to sum to 1 |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 206 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 209 in 27a5ab5
c(0.2, 0.3, 0.5) # already normalized to sum to 1 |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 216 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 219 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 225 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 230 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 234 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 237 in 27a5ab5
expect_true(is.na(tune:::.weighted_sd(c(1), c(1)))) # single value |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 243 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 246 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 248 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 259 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 267 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 269 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 280 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Lines 283 to 284 in 27a5ab5
expect_true(nrow(individual_metrics) >= 3) # At least one metric per fold |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 292 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 297 in 27a5ab5
resamples = folds, # No weights |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 303 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 314 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 317 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 328 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 337 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 341 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 351 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 355 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 364 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 366 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 377 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 380 in 27a5ab5
expected_weights <- weights / sum(weights) # normalized |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 389 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Lines 398 to 400 in 27a5ab5
splits1 <- rsample::make_splits(x = mtcars[1:20,], assessment = mtcars[21:32,]) | |
splits2 <- rsample::make_splits(x = mtcars[1:15,], assessment = mtcars[16:32,]) | |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 405 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 408 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 411 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 417 in 27a5ab5
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Lines 422 to 423 in 27a5ab5
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit
air
[air] reported by reviewdog 🐶
tune/tests/testthat/test-checks.R
Line 677 in 7fa521d
expect_false(all(abs(weighted_metrics$mean - unweighted_metrics$mean) < 1e-10)) |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Lines 2 to 3 in 7fa521d
if (rlang::is_installed(c("rsample", "parsnip", "yardstick", "workflows", "recipes", "kknn"))) { | |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 15 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 26 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 31 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 36 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 41 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 51 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 54 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 62 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 72 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 74 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 85 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 95 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 97 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 108 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 119 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 122 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 131 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 135 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 139 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 143 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 148 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 150 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 161 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 171 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 182 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 186 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 191 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 195 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 204 in 7fa521d
c(1/6, 1/3, 1/2) # normalized to sum to 1 |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 206 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 209 in 7fa521d
c(0.2, 0.3, 0.5) # already normalized to sum to 1 |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 216 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 219 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 225 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 230 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 234 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 237 in 7fa521d
expect_true(is.na(tune:::.weighted_sd(c(1), c(1)))) # single value |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 243 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 246 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 248 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 259 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 267 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 269 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 280 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Lines 283 to 284 in 7fa521d
expect_true(nrow(individual_metrics) >= 3) # At least one metric per fold |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 292 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 297 in 7fa521d
resamples = folds, # No weights |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 303 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 314 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 317 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 328 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 337 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 341 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 351 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 355 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 364 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 366 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 377 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 380 in 7fa521d
expected_weights <- weights / sum(weights) # normalized |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 389 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Lines 398 to 400 in 7fa521d
splits1 <- rsample::make_splits(x = mtcars[1:20,], assessment = mtcars[21:32,]) | |
splits2 <- rsample::make_splits(x = mtcars[1:15,], assessment = mtcars[16:32,]) | |
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 405 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 408 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 411 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Line 417 in 7fa521d
[air] reported by reviewdog 🐶
tune/tests/testthat/test-weights.R
Lines 422 to 423 in 7fa521d
} |
Sorry for the noise here - didn't realize Air was part of ci/cd now. fwiw I've been using my fork here for a while in a production process and it seems fine. I'm going to dust it off and get it ready to go asap |
Alright, I think this is back ready for review. |
Closes #990
This PR implements support for variable fold weights in hyperparameter tuning. This is useful in cases where folds may have differing numbers of observations, and you want proportional contribution to hyperparameter selection.
The implementation adds two main functions:
add_fold_weights()
to attach custom weights to rset objects, andcalculate_fold_weights()
to automatically compute weights proportional to fold sizes. Weights are stored as .fold_weights attributes and should flow through the existing tuning pipeline.Core changes are in estimate_tune_results() which now detects weights and uses weighted statistics (weighted mean, weighted standard deviation, effective sample size) when aggregating metrics. Implementation should be backwards compatible and non-breaking.